home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 23 / CU Amiga - Super CD-ROM 23 (June 1998).iso / CUCD / Graphics / STIMP_noise / source / pgmlulu / pgmlulu.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-01-30  |  3.6 KB  |  189 lines

  1.  
  2. /************************************************************************/
  3. #define OP_NAME      "pgmlulu"
  4. #define VERSION      "1.01"
  5. #define DATE         "30.01.98"
  6. #define AUTHOR       "Stefan Diener"
  7. /************************************************************************/
  8.  
  9. #include <stdio.h>
  10. #include <stdarg.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #include <sys/types.h>
  14.  
  15. #include <STIMP/pgm.c>
  16.  
  17. #define min(a,b) (((a) < (b)) ? (a) : (b))
  18. #define max(a,b) (((a) > (b)) ? (a) : (b))
  19.  
  20. struct PGM_Info source, desti;
  21. static int m, n;
  22. static int parallel=TRUE;
  23.  
  24. int L8(int x1, int x2, int x3, int x4, int x5, int x6, int x7, int x8, int x9)
  25. {
  26.   int m1, m2, m3, m4;
  27.  
  28.   m1=min(min(x1,x2), min(x5,x4));
  29.   m2=min(min(x3,x2), min(x5,x6));
  30.   m3=min(min(x4,x5), min(x7,x8));
  31.   m4=min(min(x5,x6), min(x8,x9));
  32.  
  33.   return(max(max(m1,m2), max(m3,m4)));
  34. }
  35.  
  36. int U8(int x1, int x2, int x3, int x4, int x5, int x6, int x7, int x8, int x9)
  37. {
  38.   int m1, m2, m3, m4;
  39.  
  40.   m1=max(max(x1,x2), max(x4,x5));
  41.   m2=max(max(x3,x2), max(x5,x6));
  42.   m3=max(max(x4,x5), max(x7,x8));
  43.   m4=max(max(x5,x6), max(x8,x9));
  44.  
  45.   return (min(min(m1,m2), min(m3,m4)));
  46. }
  47.  
  48. void Do_It(void)
  49. {
  50.   int i, k, x1, x2, x3, x4, x5, x6, x7, x8, x9, tempo;
  51.   unsigned char *src, *dst;
  52.  
  53.   src=source.Data;
  54.   if (parallel)
  55.   {
  56.     dst=desti.Data;
  57.     desti.maxval=source.maxval;
  58.   }
  59.  
  60.   /* oberen Rand ueberlesen */
  61.   src=src+n;
  62.  
  63.   for(k=2; k<m-1; k++)
  64.   {
  65.     /* linken Rand ueberlesen */
  66.     src++;
  67.  
  68.     /* Mitte via LULU bestimmen */
  69.     for (i=1; i<n-1; i++)
  70.     {
  71.       x1=*(src-1-n);
  72.       x2=*(src-n);
  73.       x3=*(src+1-n);
  74.       x4=*(src-1);
  75.       x5=*src;
  76.       x6=*(src+1);
  77.       x7=*(src-1+n);
  78.       x8=*(src+n);
  79.       x9=*(src+1+n);
  80.  
  81.       tempo=L8(x1,x2,x3,x4,x5,x6,x7,x8,x9);
  82.  
  83.       if (parallel)
  84.       {
  85.         *dst++ = U8(x1,x2,x3,x4,tempo,x6,x7,x8,x9);
  86.         src++;
  87.       }
  88.       else *src++ = U8(x1,x2,x3,x4,tempo,x6,x7,x8,x9);
  89.     }
  90.  
  91.     /* rechten Rand ueberlesen */
  92.     src++;
  93.   }
  94. }
  95.  
  96. int main(int argc,char **argv)
  97. /* main program */
  98. {
  99.   int i;
  100.  
  101.   /* say hello */
  102.   PrintOpening(argc,argv);
  103.  
  104.   /* read the parameters */
  105.   for (i=1; i<argc; i++)
  106.   {
  107.     if ((argv[i][0]=='-') && argv[i][1])
  108.     {
  109.       switch (argv[i][1])
  110.       {
  111.         case 'p': parallel=TRUE;
  112.                       break;
  113.  
  114.         case 's': parallel=FALSE;
  115.                       break;
  116.  
  117.         case 'v': beVerbose=FALSE;
  118.                       break;
  119.  
  120.         default: PrintMessage("Unknown parameter: %s", argv[i]);
  121.                      Hilfe();
  122.                      exit(-1);
  123.                      break;
  124.       }
  125.     }
  126.  
  127.     if (argv[i][0]=='+')
  128.     {
  129.       switch (argv[i][1])
  130.       {
  131.         case 'v': beVerbose=TRUE;
  132.                       break;
  133.  
  134.         default: PrintMessage("Unknown parameter: %s", argv[i]);
  135.                      Hilfe();
  136.                      exit(-1);
  137.                      break;
  138.       }
  139.     }
  140.   }
  141.  
  142.   /* check minimal number of arguments */
  143.   if (argc<3)
  144.   {
  145.     PrintMessage("Not enough arguments !");
  146.     Hilfe();
  147.     exit(-1);
  148.   }
  149.  
  150.   /* check number of file names */
  151.   if (FilenameCount(argc, argv)!=2)
  152.   {
  153.     PrintMessage("Wrong number of file names !");
  154.     Hilfe();
  155.     exit(-1);
  156.   }
  157.  
  158.   if (ReadPGMFile(GetFilename(1,argc,argv), &source)==0)
  159.   {
  160.     m=source.height;
  161.     n=source.width;
  162.  
  163.     if (parallel)
  164.     {
  165.       if (CreatePGMArray(m-2, n-2, &desti)==0)
  166.       {
  167.         PrintMessage("Working ...");
  168.         Do_It();
  169.  
  170.         WritePGMFile(GetFilename(2,argc,argv), &desti);
  171.         FreePGMArray(&desti);
  172.       }
  173.     }
  174.     else
  175.     {
  176.       PrintMessage("Working ...");
  177.       Do_It();
  178.  
  179.       WritePGMFile(GetFilename(2,argc,argv), &source);
  180.     }
  181.  
  182.     FreePGMArray(&source);
  183.   }
  184.  
  185.   PrintClosing();
  186.   exit(0);
  187. }
  188.  
  189.